接続先のインスタンスを識別する方法 (EC2 / RDS MySQL)
AWSで構築した環境の運用を行っていると、
「あれ、いま自分はどこ(インスタンス)にいるんだっけ?」
と思うことがあります1。
たとえ思わなかったとしても、クリティカルな操作を行う前には、いま自分がログインしているホストが確実に目的のところかどうかを確認したいという運用エンジニアは多いのではないでしょうか。
オンプレミスだった場合
これがオンプレミス環境であれば、ホスト名が明示的に設定されているところが多いかと思います。
Linuxサーバであればuname -n
コマンドで確認できますし、そもそもプロンプトに常時表示する設定も入っているでしょう。
[hogehoge@webapp01a]$ uname -n webapp01a
MySQLへリモート接続している場合は、システム変数をクエリすれば確認できます。
mysql> show variables like "hostname"; +---------------+-------------+ | Variable_name | Value | +---------------+-------------+ | hostname | db-slave001 | +---------------+-------------+ 1 row in set (0.01 sec)
EC2の場合
EC2の場合でも、もちろんオンプレミスと同じ方法が使えます。
しかしながら、デフォルトのままだとホスト名はプライベートIPアドレスをもとに自動的に決定されます。踏み台経由での接続ならまだしも、グローバルIPアドレス経由だった場合はちょっと混乱しますね。
それにAWS(というかクラウドインフラ)的には、やはりインスタンスIDで確認したくなるのが人情というものだと思うので、ここはインスタンスメタデータを参照したいと思います。
$ curl http://169.254.169.254/latest/meta-data/instance-id i-0860f8b2ccd3c245d
この169.254.169.254
というIPアドレスは リンクローカルアドレス と呼ばれるもので、イメージとしては loopback (127.0.0.1) と似たような使い方ができるものです。なので、どのインスタンスであってもここは変える必要はありません。
せっかくなので、これをプロンプトに設定しましょう。
$ PS1='[\u@'$(curl -s http://169.254.169.254/latest/meta-data/instance-id)' \w]\$ ' [ec2-user@i-0860f8b2cxxxxyyyy ~]$
また、インスタンスメタデータを使えば他にも様々な情報を取得できるので、今まで使ってこなかったという方もこの機会に是非確認してみて下さい。
RDS の場合 (MySQL / MariaDB)
RDSで起動したMySQL(MariaDB)の場合、ホスト名はこのような感じになっています。
$ mysql -uhogehoge -p -h rds01.c9wmxxxxyyyy.ap-northeast-1.rds.amazonaws.com Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. : mysql> show variables like "hostname"; +---------------+--------------+ | Variable_name | Value | +---------------+--------------+ | hostname | ip-10-7-1-13 | +---------------+--------------+ 1 row in set (0.01 sec)
ここで表示されているIPアドレス(10.7.1.13)は、エンドポイントのIPアドレスとは異なります。おそらくAWSの内部的な構成に由来しているのだと思いますが、いずれにせよ確認には使えません。
仕方ないので、「mysqlコマンド実行時に指定した接続先(エンドポイント)を改めて表示する」という一般的な方法で代替します。
system w
とすることで、いま実行中のmysqlコマンドが起動オプションごと表示できますね。ここに-h
オプションの引数も含まれるので、意図したエンドポイントに接続してるか、もう一度確認することが可能です。
mysql> system w 01:44:46 up 23 min, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT ec2-user pts/1 bastion01 02:06 1.00s 0.00s 0.00s mysql -uhogehoge -p -h rds01.c9wmxxxxyyyy.ap-northeast-1.rds.amazonaws.com mysql>
ただしこの手は、同じ踏み台(bastion)サーバから同時に複数のDBに接続している際には使えません。
その場合はPROMPT \u@\h >\_
としてプロンプトに設定してしまう手があります2。
mysql> PROMPT \u@\h >\_ PROMPT set to '\u@\h >\_' hogehoge@rds01.c9wmxxxxyyyy.ap-northeast-1.rds.amazonaws.com >
プロンプトに設定するにはエンドポイントは長すぎる一方で、常に表示されている安心感もあるので、お好みの方法で活用してみて下さい。